/*
    更新内容：
    1.通过对象传参
    2.增加装备构造函数
    3.增加英雄购买装备的方法
*/

//英雄对象构造函数
//通过对象传参不用考虑对象属性的顺序


function Hero(opt) {
    //定义一个私有属性_hp，不向外暴露，只是由于内部调用，外部用hp去调用，和下面的Object.defineProperties配合
    this._hp = opt.hp;
    this.mp = opt.mp;
    this.hj = opt.hj;
    this.gjl = opt.gjl;
    this.skills = opt.skills;
    this.kh = opt.kh;
    this.money = opt.money;
    this.zb = [];
    //初始化防御值，护甲越高防御值越高，如护甲为50防御值为0.1
    this.wlfy = this.hj / 500 >= 1 ? 1 : this.hj / 500
        //随机打印一个口号
    this.say = function() {
            //i是一个随机数
            var i = Math.round(Math.random() * (this.kh.length - 1))
            console.log(this.kh[i])
        }
        //攻击方法，对方英雄通过hero参数传入
    this.attack = function(hero) {
        //在攻击之前首先判断对方英雄的血量，如果<=0就不进行攻击。
        if (hero.hp <= 0) {
            console.log(`${hero.name}已经挂了，不要在鞭尸了！`);
            //return以后的代码都不执行
            return
        }
        //调用打印口号函数
        this.say();
        //每次攻击损失的血量，物理防御值约大损失的血量约小，当物理防御值趋近1时候，根本打不动
        var loss = this.gjl * (1 - hero.wlfy)
            //对方英雄血量减少
        hero.hp -= loss;
        //攻击之后如果对方英雄的血量小于0则置为0
        console.log(`${this.name}攻击了${hero.name}`);
        console.log(`${hero.name}减少血量${loss}，剩余血量${hero.hp}`);
        if (hero.hp <= 0) {
            console.log(`${hero.name}挂了`)
        }
    }

    //买装备
    this.buy = function(zb) {
            if (this.money >= zb.price) {
                this.getZb(zb);
                this.money -= zb.price

            }

        }
        //获得装备的方法
    this.getZb = function(zb) {
            //把装备放到zb属性里面的数组
            this.zb.push(zb);
            //通过迭代的方法赋值重点理解
            // this.gjl += zb.gjl;
            // this.hp += zb.hp;
            // this.mp += zb.mp
            for (var key in zb) {
                this[key] += zb[key]
            };
            this.skills = [...this.skills, ...zb.skills]
        }
        //配置对象的属性
    Object.defineProperties(this, {
        //配置对象的hp属性
        hp: {
            //当获取对象的hp时调用此函数
            get() {
                // console.log('hp get() is call');
                return this._hp
            },
            //单设置对象的hp时调用此函数，n就是等号右边的值
            set(n) {
                console.log('hp set() is call');
                if (n <= 0) { this._hp = 0 } else {
                    this._hp = n
                }
            }
        },
        //配置对象的name属性
        name: {
            //不可以写
            writable: false,
            // 不可以删除
            configurable: false,
            //name属性的默认值是形参传入的name
            value: opt.name
        }
    })
};

//装备对象构造函数
function Zb(opt) {
    //初始化装备的参数
    this.hj = opt.hj;
    this.gjl = opt.gjl;
    this.hp = opt.hp;
    this.mp = opt.mp;
    this.name = opt.name;
    this.skills = opt.skills;
    this.price = opt.price;
    //配置装备的属性
    Object.defineProperties(this, {
        skills: {
            // skill这个属性将不会被for-in迭代
            enumerable: false
        },

        price: {
            // price这个属性将不会被for-in迭代
            enumerable: false
        },
        name: {
            // name这个属性将不会被for-in迭代
            enumerable: false
        }
    })
}


//通过对象传参,以下是英雄的属性对象
var dmxyOpt = {
    name: "德玛西亚之力",
    kh: ['人在塔在', '德玛西亚万岁', '让你们见识德玛西亚的力量'],
    hp: 1000,
    mp: 0,
    gjl: 50,
    hj: 300,
    money: 3000,
    skills: ['沉默斩', '加护甲', '旋转陀螺', '大保健']
}
var ysOpt = {
    name: "快乐风男",
    kh: ["面对疾风吧！", "哈萨key", "长路漫漫，唯剑作伴"],
    hp: 500,
    mp: 0,
    gjl: 80,
    hj: 100,
    money: 1000,
    skills: ["斩钢", "风墙", "e", "r"]
}
var zxOpt = {
    name: "菊花信",
    kh: ["长枪依在，菊花拿来", "一点寒芒先到，随后菊花就爆", "万军之中取你首级"],
    hp: 400,
    mp: 200,
    gjl: 90,
    hj: 150,
    money: 15000,
    skills: ["q", "w", "e", "r"]
}

//装备属性对象
var sxzlOpt = {
    name: '三相之力',
    hp: 100,
    mp: 100,
    gjl: 80,
    hj: 20,
    price: 2000,
    skills: ['攻击加成被动', '速度加成别动']
}

//调用构造函数创建英雄和装备对象
var dmxy = new Hero(dmxyOpt)
var ys = new Hero(ysOpt)
var zx = new Hero(zxOpt)
var sxzl = new Zb(sxzlOpt)